import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class SaveWorld {
	private static int nPoints;
	private static int towerNumbers;
	private static List<Tower> towers;
	

	public static void main(String[] args) {
		String file = args[0];

		init(file); 
		/* Setamos uma classe controle, passando o numero de pontos, e a lista de torres contidas no arquivo de entrada */
		Control c = new Control(nPoints, towers, towerNumbers);
		c.globalSearch();
	}

	/*
	 * Metodo que le todas as informacoes do arquivo passado como entrada, e seta as estruturas de dados
	 * necessarias para manipular as informacoes (numero de pontos, numero de torres, torres)
	 */
	public static void init(final String file) {
		
		try {
			BufferedReader in = new BufferedReader(new FileReader(file));
			/* Le linha a linha o arquivo passado como parametro */
			String line = in.readLine();
			towers = new ArrayList<Tower>();
			while (line != null){
				String[] lineSplitted = line.split(" ");
				if (line.contains("N")){
					/* Caso a linha contenha 'N', atribui o proximo numero a nPoints */
					nPoints = Integer.parseInt(lineSplitted[1]);
				}else if (line.contains("M")){
					/* Caso a linha contenha 'M', atribui o proximo numero a towerNumbers */
					towerNumbers = Integer.parseInt(lineSplitted[1]);
				}else{
					/* Caso contrario, linha descreve uma torre, e os pontos cobertos por esta
					 * Portanto, instanciamos uma nova torre, e setamos os atributos (nome, custo, pontos cobertos)
					 */
					Tower t = new Tower();
					t.setName(lineSplitted[0]);
					t.setCost(Double.parseDouble(lineSplitted[1]));
					List<Integer> coveredPoints = new ArrayList<Integer>();
					for (int i = 2; i < lineSplitted.length; i++){
						coveredPoints.add(Integer.parseInt(lineSplitted[i]));
					}
					t.setCoveredPoints(coveredPoints);
					towers.add(t);
				}
				line = in.readLine();
			}

		} catch (FileNotFoundException e) {
			System.out.println("O argumento passado na entrada nao corresponde a um arquivo valido. Tente Novamente.\n");
			System.exit(1);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
